package main

import (
	"fmt"
	"sync"
)

type MutexCounter struct {
	mu    sync.Mutex
	count int64
}

func (c *MutexCounter) Increment() {
	c.mu.Lock()
	defer c.mu.Unlock()
	c.count++
}

func (c *MutexCounter) Value() int64 {
	c.mu.Lock()
	defer c.mu.Unlock()
	return c.count
}

func main() {
	var counter MutexCounter
	var wg sync.WaitGroup

	for i := 0; i < 1000; i++ {
		wg.Add(1)
		go func() {
			defer wg.Done()
			counter.Increment()
		}()
	}

	wg.Wait()
	fmt.Println("Final count:", counter.Value())
}

/*

3. 性能对比和选择建议
性能特点：
atomic：更轻量，适合简单的读-修改-写操作

Mutex：更通用，适合复杂的临界区操作

选择建议：
对于简单的计数器，优先使用 atomic 包

如果需要执行多个相关操作，使用 Mutex

如果只有写操作需要同步，读操作很多，考虑 sync.RWMutex

*/
